package com.xxxx.server.controller;


import com.fasterxml.jackson.annotation.JsonProperty;
import com.github.xiaoymin.swaggerbootstrapui.annotations.EnableSwaggerBootstrapUI;
import com.xxxx.server.pojo.Admin;
import com.xxxx.server.pojo.AdminLoginParam;
import com.xxxx.server.pojo.RespBean;
import com.xxxx.server.service.IAdminService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.security.Principal;

@EnableSwaggerBootstrapUI
// 表示swagg注解
@Api(tags = "LoginController")
@RestController
public class LoginController {

    @Autowired
    private IAdminService adminService;

    // swagger注释
    @ApiOperation(value = "登录之后返回token")
    @PostMapping("/login")
    // HttpServletRequest request：获得客户端请求的所有信息
    // @JsonProperty(value = "adminLoginParam")
    public RespBean login(@RequestBody AdminLoginParam adminLoginParam, HttpServletRequest request) {
        return adminService.login(
                adminLoginParam.getUsername(),
                adminLoginParam.getPassword(),
                adminLoginParam.getCode(),
                request);
    }

    @ApiOperation(value = "获取当前用户信息")
    @GetMapping("/admin/info")
    // 对象设置到全局并更新之后，可以使用principal对象获取到当前登录的对象
    public Admin getAdminInfo(Principal principal) {
        if (null == principal) {
            return null;
        }
        // getName()获取用户名
        String username = principal.getName();
        // 根据用户名username获取用户信息admin
        Admin admin = adminService.getAdminByUserName(username);
        // 保护用户密码，将密码设置为null，不返回到前段
        admin.setPassword(null);
        // 根据用户id查role角色列表
        admin.setRoles(adminService.getRoles(admin.getId()));
        // 返回用户信息
        return admin;
    }

    // 和前端定义好，前端处理退出功能，后端返回成功的接口
    @ApiOperation(value = "退出登录")
    @PostMapping("/logout")
    // 登录后返回token。前端把token放在请求头里，访问任何接口都会携带token令牌，我们会写一个拦截器去判断token是否合法有效
    // 如果合法有效去访问接口，现在返回logout，会直接返回200状态码，把请求头里的token删除。
    public RespBean logout() {
        return RespBean.success("注销成功！");
    }

}
